#!/usr/bin/env node

const fs = require("fs");
const path = require("path");
const { convertDatToAss } = require("./convert_dat_to_ass");
const { generateWordASSFromFile } = require("./utils/wordAssGenerator");
const config = JSON.parse(fs.readFileSync(path.join(__dirname, "..", "config.json"), "utf8"));

// 获取命令行参数
const args = process.argv.slice(2);
let datFilePath = null;

// 检查是否提供了DAT文件路径参数
if (args.length > 0) {
  datFilePath = args[0];
}

// 输入和输出目录
const inputDirDat = config.inputDirDat;
const outputDirSrt = config.outputDirSrt;

// 确保输出目录存在
if (!fs.existsSync(outputDirSrt)) {
  fs.mkdirSync(outputDirSrt, { recursive: true });
}

console.log("开始转换所有DAT文件为ASS格式...");

let datFiles = [];

// 如果提供了直接的DAT文件路径，则使用该文件
if (datFilePath && fs.existsSync(datFilePath) && path.extname(datFilePath) === ".dat") {
  datFiles = [datFilePath];
  console.log(`使用指定的DAT文件: ${datFilePath}`);
} else {
  // 否则扫描inputDirDat目录查找所有DAT文件
  if (!fs.existsSync(inputDirDat)) {
    console.error(`！！！错误: 输入目录不存在: ${inputDirDat}`);
    process.exit(1);
  }

  // 递归查找所有DAT文件
  function findDatFiles(dir) {
    let results = [];
    const files = fs.readdirSync(dir);

    files.forEach(file => {
      const filePath = path.join(dir, file);
      const stat = fs.statSync(filePath);

      if (stat.isDirectory()) {
        // 递归搜索子目录
        results = results.concat(findDatFiles(filePath));
      } else if (path.extname(file) === ".dat") {
        results.push(filePath);
      }
    });

    return results;
  }

  datFiles = findDatFiles(inputDirDat);
}

if (datFiles.length === 0) {
  console.log("没有找到DAT文件");
  process.exit(0);
}

console.log(`找到 ${datFiles.length} 个DAT文件`);

// 转换每个DAT文件
async function processDatFiles() {
  for (let index = 0; index < datFiles.length; index++) {
    const file = datFiles[index];
    try {
      console.log(`\n[${index + 1}/${datFiles.length}] 转换文件: ${file}`);

      // 生成输出文件名（使用与输入文件相同的文件名，但扩展名改为.ass）
      const fileName = path.basename(file, ".dat");
      const assFilePath = path.join(outputDirSrt, `${fileName}.ass`);
      const wordAssFilePath = path.join(outputDirSrt, `${fileName}_words.ass`);

      // 执行转换
      convertDatToAss(file, assFilePath);
      //assPath, wordAssPath, wordStyles
      await generateWordASSFromFile(assFilePath, wordAssFilePath, config.projectSettings.wordStyles);

      console.log(`  字幕已保存到: ${assFilePath}`);
    } catch (error) {
      console.error(`！！！  转换失败: ${error.message}`);
    }
  }

  console.log("  所有DAT文件转换完成！");
}

processDatFiles();
